OVN (Open Virtual Network) 包含二個主要的database, 一個是 North bound DB,另一個是South bound DB。
North bound DB: 儲存邏輯網路的資訊,被下列二個元件存取
South bound DB: 儲存邏輯網路與實體網路對應的資訊,被下列二個元件存取
整個來說,透過nbctl建立邏輯網路寫入North bound DB,ovn-northd將North bound DB轉換成logical flow寫入到South bound DB,
ovn-controller將South bound DB的logical flow轉換成OpenFlow rule寫入到OpneVSwitch.
在這張圖中,我使用的表示法與 OVN 官方文件上稍有不同。官網上是由 CMS(Cloud Manager System) 寫入 Northbound Database,但我使用的是 ovn-nbctl。然而,二者的概念是一樣的。在不同的 CMS(如 OpenStack),CMS 必須先將建立的 Network 模型轉換成 OVN 邏輯網路的描述,然後再將其寫入 Northbound Database。在這裡,因為我們目前還沒有說明 OVN 與像 OpenStack 這樣的 CMS 之間的關聯,所以我直接用 ovn-nbctl 取代了 CMS。
我同時把操作OVN時,最常用的三個指令用綠色來表示,分別是ovn-nbctl、ovn-sbctl以及ovs-vsctl。ovn-nbctl剛剛已經介紹過了,主要是用來建立/查詢我們想使用的邏輯網路架構。而ovn-sbctl則是用來查詢South bound DB,也就是說,邏輯網路和實體網路的對路,可以透過ovn-sbctl來查詢。這二個指令,都是要在controller上執行,因為North/South bound DB都是在controlle阿。另一個較特殊的是ovs-vsctl這個指令,這個指令可以用來查詢每一個hypervisor上的bridge狀況,所以必需在每一個hypervisor執行。當然ovs-vsctl不單單只是用來查詢hypervisor的bridge狀態,還有其他的功能,我們以後都會提到,目前最重要的是知道這三個指令要在那個節點上執行就夠囉。
有了對 OVN 架構的基本認識後,我們需要一個包含 controller 與 hypervisor 兩種不同角色節點的測試環境,以驗證我們的理解。
在我們的測試環境中,第一個 controller 節點,除了擔任 controller 的角色外,還同時擔任 hypervisor 的角色;而第二個節點,就單純做為hypervisor使用。
在此特別提醒注意,不要讓防火牆封鎖 6441/TCP、6442/TCP 和 6081/UDP 這三個端口。其中, 6441/TCP 和 6442/TCP 是 Northbound Database 和 Southbound Database 使用的端口;而 6081/UDP 則是 dataplane 所使用的端口。如果這些端口被阻擋,邏輯網路就無法正常運作。
以下是可供在 Ubuntu 環境下自行安裝的指令:
apt-get update
apt-get -y install build-essential fakeroot
apt-get -y install python-six openssl
apt-get -y install openvswitch-switch openvswitch-common
# install on controller
apt-get -y install ovn-central ovn-common ovn-host
export CONTROLLER_IP=<CONTROLLER_IP>
ovn-nbctl set-connection ptcp:6641:${CONTROLLER_IP}
ovn-sbctl set-connection ptcp:6642:${CONTROLLER_IP}
ovs-vsctl set open . external-ids:ovn-remote=tcp:${CONTROLLER_IP}:6642
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=${CONTROLLER_IP}
apt-get update
apt-get -y install build-essential fakeroot
apt-get -y install python-six openssl
apt-get -y install openvswitch-switch openvswitch-common
# install on hypervisor
apt-get -y install ovn-host ovn-common
export HYPERVISOR_IP=<HYPERVISOR_IP>
export CONTROLLER_IP=<CONTROLLER_IP>
ovs-vsctl set open . external-ids:ovn-remote=tcp:${CONTROLLER_IP}:6642
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=${HYPERVISOR_IP}
如果您認為上述步驟仍然太複雜,我也有整理一個 Vagrantfile,可以直接透過 Vagrant 啟動一個包含一個 controller 與一個 hypervisor 的兩個節點群集。
git clone https://github.com/ogre0403/iTHome-2023.git
cd iTHome-2023/day-01
vagrant up
最後我們完成的測試環境長得就像這個樣子。讓我們來觀查一下這個環境幾點該注意的地方吧。
剛才觀查的最後一點,hypervisor的chassis id和 br-int上的port名稱,這二者之間到底有什麼關連呢?
實際上,當OVN架構裡有N個hypervisor時,br-int上就會有N-1個port,每個port的名稱都對應至一個hypervisor的chassis id。封包要出去時,就直接依照目的地hypervisor, 由相對應的port送出。
例如,如果現在有一個controller上的虛擬機器VM1,要送封包給hypervisor上的虛擬機器VM2,VM1的封包的送出去的流向是 VM1 -> controller的br-int的ovn-a17b40-0 -> controller的genv_sys_6081 -> controller的eth1, 之後,這個封包就會直接送給hypervisor.
說到這裡,可能還不是非常俱體,後面我們會有更完整的實驗,讓大家更理解整個流程。
讓我們分別在controller/hypervisor上,檢查目前有那些OVN的process正在執行吧。
首先,在controller上,可以看到有二個ovsdb-server,一個使用6641/TCP,一個使用6642/TCP。這二個分別是North bound DB與South bound DB。
還記得我們把controller也當成hypervisor來使用嗎? 所以可以看到有ovn-controller這個process,並且向controller:6642建立連結。
另外,也可以看到6081/UDP,而這個Port是OVN透過 GENEVE protocol建立的overlay網路,要跨節點通訊時所要用到的port。
vagrant ssh controller -c 'sudo netstat -alntpu' | grep -Ev ':22|:53|:68'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.33.10:6641 0.0.0.0:* LISTEN 10480/ovsdb-server
tcp 0 0 192.168.33.10:6642 0.0.0.0:* LISTEN 10484/ovsdb-server
tcp 0 0 192.168.33.10:39744 192.168.33.10:6642 ESTABLISHED 9685/ovn-controller
tcp 0 0 192.168.33.10:6642 192.168.33.20:49676 ESTABLISHED 10484/ovsdb-server
tcp 0 0 192.168.33.10:6642 192.168.33.10:39744 ESTABLISHED 10484/ovsdb-server
udp 0 0 0.0.0.0:6081 0.0.0.0:* -
udp6 0 0 :::6081 :::* -
再來,在hypervisor上,看到ovn-controller向controller:6642(就是South bound DB)建立連線,同時,6081/UDP也是正處於listen。
vagrant ssh hypervisor -c 'sudo netstat -alntpu' | grep -Ev ':22|:53|:68'
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.33.20:49676 192.168.33.10:6642 ESTABLISHED 9675/ovn-controller
udp 0 0 0.0.0.0:6081 0.0.0.0:* -
udp6 0 0 :::6081 :::* -
今天我們學到了OVN的整體架構,以及OVN裡North bound DB、South bound DB等元件之間的關係,也安裝一個二個節點的OVN cluster,
並驗證了元件之間連線的關係。明天,我們將和大家介紹,如何透過ovn-nbctl建立邏輯網路。